Skip to content

Conversation

@Myestery
Copy link
Contributor

@Myestery Myestery commented Jan 30, 2026

Summary

This PR removes any types from core source files and replaces them with proper TypeScript types.

Key Changes

Type Safety Improvements

  • Replaced any with unknown, explicit types, or proper interfaces across core files
  • Introduced new type definitions: SceneConfig, Load3DNode, ElectronWindow
  • Used Object.assign instead of as any for dynamic property assignment
  • Replaced as any casts with proper type assertions

Files Changed

Source files:

  • src/extensions/core/widgetInputs.ts - Removed unnecessary as any cast
  • src/platform/cloud/onboarding/auth.ts - Used Record<string, unknown> and Sentry types
  • src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts - Used AuditLog[] type
  • src/platform/workflow/management/stores/workflowStore.ts - Used typeof ComfyWorkflow constructor type
  • src/scripts/app.ts - Used ResultItem[] for Clipspace images
  • src/services/colorPaletteService.ts - Used Object.assign instead of as any
  • src/services/customerEventsService.ts - Used unknown instead of any
  • src/services/load3dService.ts - Added proper interface types for Load3D nodes
  • src/types/litegraph-augmentation.d.ts - Used TWidgetValue[] type
  • src/utils/envUtil.ts - Added ElectronWindow interface
  • src/workbench/extensions/manager/stores/comfyManagerStore.ts - Typed event as CustomEvent<{ ui_id?: string }>

Testing

  • All TypeScript type checking passes (pnpm typecheck)
  • Linting passes without errors (pnpm lint)
  • Code formatting applied (pnpm format)

Part of the "Road to No Explicit Any" initiative.

Previous PRs in this series:

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

📝 Walkthrough

Walkthrough

A type-safety pass: multiple any casts replaced with specific types across LiteGraph widgets, services, platform utilities, telemetry, and workflow code; added small local interfaces and tightened several method signatures. No behavioral changes to runtime logic reported.

Changes

Cohort / File(s) Summary
LiteGraph & widget inputs
src/types/litegraph-augmentation.d.ts, src/extensions/core/widgetInputs.ts
Import TWidgetValue; change LGraphNode.widgets_values from unknown[] to TWidgetValue[]; remove an as any cast when assigning saved widget values.
Clipspace typings
src/scripts/app.ts
Constrain Clipspace.images from any[] to ResultItem[].
Services: 3D, color, events
src/services/load3dService.ts, src/services/colorPaletteService.ts, src/services/customerEventsService.ts
Add SceneConfig and Load3DNode interfaces; tighten scene/node casts and conditional syncLoad3dConfig calls; replace per-property LiteGraph assignment with Object.assign and normalized NODE_DEFAULT_SHAPE; change formatJsonValue(value: any)formatJsonValue(value: unknown).
Platform / telemetry / workflow
src/platform/cloud/onboarding/auth.ts, src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts, src/platform/workflow/management/stores/workflowStore.ts
Narrow parameter types (e.g., extraContext, tags, sentryOptions); import AuditLog and change `checkForCompletedTopup(events: AuditLog[]
Electron & event handling
src/utils/envUtil.ts, src/workbench/extensions/manager/stores/comfyManagerStore.ts
Add ElectronWindow type for typed electronAPI access; change event listener callback type to CustomEvent<{ ui_id?: string }> to type event.detail.

Possibly related PRs

Suggested reviewers

  • DrJKL
  • jtydhr88
  • simula-r
  • christian-byrne
  • AustinMroz
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/remove-any-types-core

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Replace `any` with proper TypeScript types across multiple files:
- widgetInputs.ts: remove unnecessary `as any` cast
- auth.ts: use `Record<string, unknown>` and Sentry types
- MixpanelTelemetryProvider.ts: use `AuditLog[]` type
- workflowStore.ts: use `typeof ComfyWorkflow` constructor type
- app.ts: use `ResultItem[]` for Clipspace images
- colorPaletteService.ts: use `Object.assign` instead of `as any`
- customerEventsService.ts: use `unknown` instead of `any`
- load3dService.ts: add proper interface types for Load3D nodes
- comfy.ts: extend Object for ComfyExtension interface
- litegraph-augmentation.d.ts: use `TWidgetValue[]` type
- envUtil.ts: add ElectronWindow interface
- comfyManagerStore.ts: type event as `CustomEvent<{ ui_id?: string }>`
@Myestery Myestery force-pushed the fix/remove-any-types-core branch from 8b837e5 to b13f5d5 Compare January 30, 2026 22:59
@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 02/02/2026, 12:26:36 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎭 Playwright Tests: ✅ Passed

Results: 507 passed, 0 failed, 0 flaky, 8 skipped (Total: 515)

📊 Browser Reports
  • chromium: View Report (✅ 495 / ❌ 0 / ⚠️ 0 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 9 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

Bundle Size Report

Summary

  • Raw size: 22.2 MB baseline 22.2 MB — 🔴 +102 B
  • Gzip: 4.62 MB baseline 4.62 MB — 🔴 +95 B
  • Brotli: 3.43 MB baseline 3.43 MB — 🔴 +6 B
  • Bundles: 175 current • 175 baseline • 83 added / 83 removed

Category Glance
Data & Services 🔴 +102 B (2.72 MB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Other ⚪ 0 B (7.17 MB) · Graph Workspace ⚪ 0 B (978 kB) · Panels & Settings ⚪ 0 B (471 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

Per-category breakdown
App Entry Points — 26 kB (baseline 26 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CPZ4zPyb.js (removed) 26 kB 🟢 -26 kB 🟢 -7.51 kB 🟢 -6.62 kB
assets/index-CXr8MOBp.js (new) 26 kB 🔴 +26 kB 🔴 +7.51 kB 🔴 +6.61 kB

Status: 1 added / 1 removed

Graph Workspace — 978 kB (baseline 978 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BYoDDnGi.js (removed) 978 kB 🟢 -978 kB 🟢 -198 kB 🟢 -149 kB
assets/GraphView-D221s5I_.js (new) 978 kB 🔴 +978 kB 🔴 +198 kB 🔴 +149 kB

Status: 1 added / 1 removed

Views & Navigation — 80.7 kB (baseline 80.7 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CzXlcwC4.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-Dpol6g4W.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudLoginView-Bfnko_1s.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/CloudLoginView-BzHys8NY.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/UserCheckView-DBSO68vO.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.45 kB 🟢 -2.13 kB
assets/UserCheckView-Dfgc9KKY.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-CU0sTrZ4.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.24 kB 🟢 -1.96 kB
assets/CloudLayoutView-DLsIJtFS.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.95 kB
assets/CloudSignupView-Co0Iun00.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.02 kB
assets/CloudSignupView-CYIBbmg2.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudForgotPasswordView-a0a4F2oV.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/CloudForgotPasswordView-An9YI4dV.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/UserSelectView-6Xe9OiSj.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/UserSelectView-B-wk1s16.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-OcmHowDm.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-rGBQxBUq.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-DEi_qSwK.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.7 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-DJINHunu.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-DIeFUzGa.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C3R3uE_I.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 471 kB (baseline 471 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-6sOTPdCu.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.9 kB 🔴 +5.13 kB
assets/WorkspacePanel-CSybBel-.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.14 kB
assets/LegacyCreditsPanel-BPv5m4Y8.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-BvGuYSAn.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.94 kB 🟢 -5.22 kB
assets/SubscriptionPanel-DRoz_SRe.js (removed) 21 kB 🟢 -21 kB 🟢 -5.05 kB 🟢 -4.44 kB
assets/SubscriptionPanel-nPtPwezw.js (new) 21 kB 🔴 +21 kB 🔴 +5.04 kB 🔴 +4.45 kB
assets/KeybindingPanel-CSZ5E12D.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +3.76 kB 🔴 +3.34 kB
assets/KeybindingPanel-D0T1ebNm.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -3.76 kB 🟢 -3.34 kB
assets/AboutPanel-DzfTvCSg.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.42 kB
assets/AboutPanel-zdrtG4gG.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.42 kB
assets/ExtensionPanel-CwWzYvg3.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ExtensionPanel-DVxsVTRM.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.42 kB
assets/ServerConfigPanel-DZ2GRV8x.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-IfR0VzbI.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.93 kB
assets/UserPanel-BHMAMNtp.js (new) 6.71 kB 🔴 +6.71 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/UserPanel-BRSs06S_.js (removed) 6.71 kB 🟢 -6.71 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/refreshRemoteConfig-BmCR18vg.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -571 B 🟢 -498 B
assets/refreshRemoteConfig-BQonUBht.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +571 B 🔴 +497 B
assets/config-B94bcjn0.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -604 B 🟢 -534 B
assets/config-Cl9gb3Ff.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +603 B 🔴 +530 B
assets/cloudRemoteConfig-D2wRYJKI.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -509 B 🟢 -437 B
assets/cloudRemoteConfig-Docrdp0Y.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +508 B 🔴 +437 B
assets/refreshRemoteConfig-CiyOI9G9.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -109 B
assets/refreshRemoteConfig-VOvoRYS4.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +106 B
assets/remoteConfig-B0mlVvm7.js 788 B 788 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings--kdIt6Ri.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bz57yvlp.js 25.8 kB 25.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CDJne0Sg.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CmfKjjkA.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-crWL6KAZ.js 39.4 kB 39.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CYbRky-T.js 29.4 kB 29.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D_kNbI7_.js 35.2 kB 35.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dn1HqM1j.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-EPgYkg8b.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ShWh746R.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-slBzDG7F.js 30.2 kB 30.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

User & Accounts — 3.94 kB (baseline 3.94 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BUPcB-OK.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.07 kB
assets/auth-DKcX61_c.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.08 kB
assets/firebaseAuthStore-DmtVomsD.js (removed) 217 B 🟢 -217 B 🟢 -137 B 🟢 -128 B
assets/firebaseAuthStore-DuqYlG9B.js (new) 217 B 🔴 +217 B 🔴 +137 B 🔴 +125 B
assets/auth-BAfHCB7j.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -137 B
assets/auth-DcLjGyxg.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +147 B

Status: 3 added / 3 removed

Editors & Dialogs — 2.89 kB (baseline 2.89 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BVpmjfae.js (new) 2.71 kB 🔴 +2.71 kB 🔴 +1.29 kB 🔴 +1.14 kB
assets/useSubscriptionDialog-BWB3Vpnn.js (removed) 2.71 kB 🟢 -2.71 kB 🟢 -1.29 kB 🟢 -1.13 kB
assets/useSubscriptionDialog-CJH0L1dP.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -100 B
assets/useSubscriptionDialog-pHnNXiGA.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +99 B

Status: 2 added / 2 removed

UI Components — 33.7 kB (baseline 33.7 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Bc2wHmSP.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/ComfyQueueButton-N1EWSjVd.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/SubscribeButton-BuqzPvyv.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/SubscribeButton-CKZixy0n.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.38 kB
assets/cloudFeedbackTopbarButton-5gIxkxQu.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -676 B 🟢 -570 B
assets/cloudFeedbackTopbarButton-BDGRrs05.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +676 B 🔴 +565 B
assets/ComfyQueueButton-BTChoHMa.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -121 B
assets/ComfyQueueButton-FLjLWuD2.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +121 B
assets/Button-D_3gqTPH.js 3.82 kB 3.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-xtM39a5u.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-BVHWMUK_.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-D80lITos.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-D9iI72GP.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Data & Services — 2.72 MB (baseline 2.72 MB) • 🔴 +102 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-XhqPGB_6.js (new) 2.02 MB 🔴 +2.02 MB 🔴 +429 kB 🔴 +327 kB
assets/dialogService-_hUh_HaH.js (removed) 2.02 MB 🟢 -2.02 MB 🟢 -429 kB 🟢 -327 kB
assets/api-8Nrp8PVn.js (new) 675 kB 🔴 +675 kB 🔴 +149 kB 🔴 +119 kB
assets/api-CaumAv42.js (removed) 675 kB 🟢 -675 kB 🟢 -149 kB 🟢 -119 kB
assets/releaseStore-0H4169tz.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.39 kB 🟢 -2.11 kB
assets/releaseStore-B44SItbj.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.11 kB
assets/keybindingService-CAUG00Mi.js (removed) 6.74 kB 🟢 -6.74 kB 🟢 -1.75 kB 🟢 -1.51 kB
assets/keybindingService-DAGWj75Q.js (new) 6.74 kB 🔴 +6.74 kB 🔴 +1.76 kB 🔴 +1.51 kB
assets/bootstrapStore-CIKdH287.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.03 kB 🔴 +937 B
assets/bootstrapStore-CQBXe2j-.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.03 kB 🟢 -959 B
assets/userStore-BeMWzpC3.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +810 B 🔴 +725 B
assets/userStore-DbC4TVSg.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -811 B 🟢 -725 B
assets/audioService-CgrYIXIL.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +929 B 🔴 +815 B
assets/audioService-DfvyEaOL.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -926 B 🟢 -811 B
assets/releaseStore-BtNKz_Gp.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +105 B
assets/releaseStore-BupmpXRd.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -106 B
assets/serverConfigStore-B4PsmGgu.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

Utilities & Hooks — 25.3 kB (baseline 25.3 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-DWW0Sszw.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/useErrorHandling-Dz7e5KJX.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/useWorkspaceUI-Cd4vnZUP.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +976 B 🔴 +835 B
assets/useWorkspaceUI-DWsXNvmz.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -976 B 🟢 -840 B
assets/useSubscriptionActions-C6qY8aHR.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -870 B 🟢 -761 B
assets/useSubscriptionActions-IdqerGnq.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +872 B 🔴 +760 B
assets/subscriptionCheckoutUtil-DM1PLgxc.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -869 B 🟢 -763 B
assets/subscriptionCheckoutUtil-S9dsHlxK.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +871 B 🔴 +760 B
assets/useSubscriptionCredits-CyUWN0Y0.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -598 B 🟢 -529 B
assets/useSubscriptionCredits-DqMdaWo3.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +599 B 🔴 +530 B
assets/audioUtils-7VgMRkLk.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -481 B
assets/audioUtils-Dp0gmsY7.js (new) 970 B 🔴 +970 B 🔴 +548 B 🔴 +458 B
assets/useCurrentUser-B9SHV-LE.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +100 B
assets/useCurrentUser-DWJrqEA2.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -102 B
assets/_plugin-vue_export-helper-DuK_Fly3.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BjSbjz7i.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-B_PGIBYn.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-DXdzAQWK.js 488 B 488 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

Vendor & Third-Party — 10.7 MB (baseline 10.7 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-DHGfk3hn.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CQ-cKqyS.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-4Jj8eU28.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-aCG649nF.js 263 kB 263 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CERwhPwK.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxrEVL6s.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Dwii0E-t.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-IX6P8SWv.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.17 MB (baseline 7.17 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-C67JXjUt.js (removed) 97.8 kB 🟢 -97.8 kB 🟢 -23.4 kB 🟢 -20.1 kB
assets/core-C77sAeMB.js (new) 97.8 kB 🔴 +97.8 kB 🔴 +23.4 kB 🔴 +20.1 kB
assets/groupNode-BJPR3lbw.js (removed) 74.7 kB 🟢 -74.7 kB 🟢 -18.1 kB 🟢 -15.9 kB
assets/groupNode-QbQnRD0q.js (new) 74.7 kB 🔴 +74.7 kB 🔴 +18.1 kB 🔴 +15.9 kB
assets/WidgetSelect-DSfwYwnW.js (removed) 64.5 kB 🟢 -64.5 kB 🟢 -12.8 kB 🟢 -11 kB
assets/WidgetSelect-qHgplYZ3.js (new) 64.5 kB 🔴 +64.5 kB 🔴 +12.8 kB 🔴 +11.1 kB
assets/Load3DControls-DczEpgoL.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.08 kB
assets/Load3DControls-DkOdC-qg.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.08 kB
assets/SubscriptionRequiredDialogContent-C53LWn6r.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.79 kB 🔴 +5.93 kB
assets/SubscriptionRequiredDialogContent-DwzVsGh-.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.79 kB 🟢 -5.92 kB
assets/CurrentUserPopoverWorkspace-CNYuocGQ.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.42 kB
assets/CurrentUserPopoverWorkspace-De4zMA3D.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.43 kB
assets/Load3D-DQFaEO-f.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -4.42 kB 🟢 -3.87 kB
assets/Load3D-YDtsJE5o.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +4.42 kB 🔴 +3.89 kB
assets/WidgetInputNumber-Btb-93sh.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.52 kB 🟢 -4.03 kB
assets/WidgetInputNumber-CZ-DvgfR.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.52 kB 🔴 +4.03 kB
assets/WidgetRecordAudio-B7VvzR28.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.97 kB 🟢 -4.44 kB
assets/WidgetRecordAudio-Dy5CuVMt.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/SubscriptionPanelContentWorkspace-C0YidZgO.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.9 kB
assets/SubscriptionPanelContentWorkspace-DKWhkvuX.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.89 kB
assets/WidgetImageCrop-CbO3YLr_.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/WidgetImageCrop-TyC4loIP.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/PanelTemplate-BTjJjEir.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.46 kB 🟢 -4.8 kB
assets/PanelTemplate-BUDUxIik.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.46 kB 🔴 +4.8 kB
assets/AudioPreviewPlayer-Dde3FBXA.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-TstMM_Dc.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/nodeTemplates-BjCD475O.js (new) 9.45 kB 🔴 +9.45 kB 🔴 +3.16 kB 🔴 +2.79 kB
assets/nodeTemplates-CSJ2ZZHJ.js (removed) 9.45 kB 🟢 -9.45 kB 🟢 -3.16 kB 🟢 -2.8 kB
assets/InviteMemberDialogContent-C75kYFzr.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.51 kB 🟢 -2.17 kB
assets/InviteMemberDialogContent-Fc9NFKBT.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.51 kB 🔴 +2.17 kB
assets/WidgetWithControl-BOsmGJR3.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.68 kB 🔴 +2.41 kB
assets/WidgetWithControl-DlfHNxlW.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.68 kB 🟢 -2.41 kB
assets/CreateWorkspaceDialogContent-DLjKo7pD.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-DQT3NZPG.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-_iVdGBlg.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/EditWorkspaceDialogContent-DQzPFmap.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/ValueControlPopover-CkmEjynA.js (removed) 5.17 kB 🟢 -5.17 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/ValueControlPopover-Tro7B-E-.js (new) 5.17 kB 🔴 +5.17 kB 🔴 +1.69 kB 🔴 +1.5 kB
assets/DeleteWorkspaceDialogContent-Db5S-nDi.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-ujuHlki0.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.57 kB 🔴 +1.35 kB
assets/LeaveWorkspaceDialogContent-bI6FwRj0.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.51 kB 🔴 +1.31 kB
assets/LeaveWorkspaceDialogContent-Do588_Vx.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.51 kB 🟢 -1.31 kB
assets/RemoveMemberDialogContent-96O8lKAP.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.46 kB 🔴 +1.27 kB
assets/RemoveMemberDialogContent-uFbTMXu6.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.45 kB 🟢 -1.27 kB
assets/RevokeInviteDialogContent-D_9QVx0x.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/RevokeInviteDialogContent-DsuvNB8C.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/GlobalToast-C9noWRDR.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +944 B
assets/GlobalToast-Oi1Il8HZ.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -944 B
assets/SubscribeToRun-BltG9eVO.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-Drx8N83S.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-c02tYORg.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +939 B 🔴 +808 B
assets/cloudSessionCookie-t7SSgGH7.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -935 B 🟢 -807 B
assets/BaseViewTemplate-BBzih_dd.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +942 B
assets/BaseViewTemplate-C0MRPkEU.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -948 B
assets/CloudRunButtonWrapper-CJO6j0UY.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +648 B 🔴 +567 B
assets/CloudRunButtonWrapper-CozMlTJp.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -644 B 🟢 -601 B
assets/cloudBadges-C65phEO-.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -536 B 🟢 -474 B
assets/cloudBadges-Dasq2SpP.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +537 B 🔴 +475 B
assets/graphHasMissingNodes-BdvHCjmt.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +461 B 🔴 +416 B
assets/graphHasMissingNodes-O7U-HV32.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -461 B 🟢 -410 B
assets/cloudSubscription-A6wRJrKs.js (new) 976 B 🔴 +976 B 🔴 +463 B 🔴 +398 B
assets/cloudSubscription-O1S7ZPK9.js (removed) 976 B 🟢 -976 B 🟢 -464 B 🟢 -394 B
assets/nightlyBadges-D86iWlqR.js (new) 595 B 🔴 +595 B 🔴 +356 B 🔴 +308 B
assets/nightlyBadges-ekYbc8_V.js (removed) 595 B 🟢 -595 B 🟢 -354 B 🟢 -310 B
assets/SubscriptionPanelContentWorkspace-B7EdJ_J7.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +124 B
assets/SubscriptionPanelContentWorkspace-Dqv5Xq8F.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -125 B
assets/WidgetInputNumber-BQSTBxuN.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -110 B
assets/WidgetInputNumber-InzMfJBm.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +119 B
assets/WidgetLegacy-Cu-RG0_3.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -118 B
assets/WidgetLegacy-DN_Guj0M.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +110 B
assets/Load3D-BLFzHSUr.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -107 B
assets/Load3D-DEO60cY7.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +106 B
assets/auto-DWs2ctGL.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-2Ummrt4M.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-8WuluAqM.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BViLP6Ia.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWPBsR-j.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ByXor5xN.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C5-8fNtq.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CTC-eRiE.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CwopaVr4.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-gY5a0Gsv.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mFAeWi-p.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-tMuFl0J5.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-8QnNT-H4.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CHVjJGfe.js 504 kB 504 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DqhWvXbV.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BbU3jvmz.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BNS3riuS.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BrtCV7Bk.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C4U1m7i3.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ch4KooEl.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DfTcOVNP.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DyJ_W2qZ.js 175 kB 175 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DyOi1LHY.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-SUJPWsXI.js 156 kB 156 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-w5Cua0MA.js 127 kB 127 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-wwqSj12G.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DGffIyse.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-ISx56tjc.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BvQKeiy3.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CQptuwWY.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-DlEKfwN6.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7GrJxNsU.js 349 kB 349 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B1KZZk2Z.js 421 kB 421 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BAj0vo3H.js 347 kB 347 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bmu0YCiI.js 371 kB 371 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CbuEO-JI.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CkWRu1hh.js 458 kB 458 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CLEOp9MY.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D0Fx1Opq.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DsEVwLcc.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Pp9cUQcQ.js 381 kB 381 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-tOCboSV8.js 422 kB 422 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DZ4Ggh4M.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-YlH9vant.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BJiJuR5i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CUtab2CB.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-D79nBMxa.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-dhHvUOFA.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-cRI313QT.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-MfBWF1yN.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DSVm_Uz5.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-Bz7yzVMl.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BSWbqxVP.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-B0KF0DcT.js 3.49 kB 3.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-C63n39Js.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DXeivNCO.js 3.87 kB 3.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B_RS0lot.js 3.26 kB 3.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-KPj-zM0O.js 573 B 573 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 36 added / 36 removed

@Myestery Myestery marked this pull request as ready for review January 30, 2026 23:04
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Jan 30, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/services/customerEventsService.ts (1)

125-135: 🧹 Nitpick | 🔵 Trivial

Good change from any to unknown.

This aligns with the coding guidelines to avoid any. The type narrowing via typeof checks works correctly with unknown.

Consider adding an explicit return type and converting the fallback to string for consistency, since this value is used in string interpolation at line 162.

💡 Optional: explicit return type and safer fallback
-  function formatJsonValue(value: unknown) {
+  function formatJsonValue(value: unknown): string | number {
     if (typeof value === 'number') {
       // Format numbers with commas and decimals if needed
       return value.toLocaleString()
     }
     if (typeof value === 'string' && value.match(/^\d{4}-\d{2}-\d{2}/)) {
       // Format dates nicely
       return new Date(value).toLocaleString()
     }
-    return value
+    return String(value)
   }
🤖 Fix all issues with AI agents
In `@src/services/load3dService.ts`:
- Around line 10-14: You’ve duplicated the SceneConfig interface locally;
replace the local definition in load3dService.ts with an import of the canonical
SceneConfig interface from the project’s load3d interfaces module so you use the
full, single source of truth (including showGrid, backgroundColor,
backgroundImage, backgroundRenderMode); update the import statements to import
SceneConfig and remove the local interface declaration to prevent drift.

Comment on lines 10 to 14
// Type definitions for Load3D node
interface SceneConfig {
backgroundImage?: string
[key: string]: unknown
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if SceneConfig exists in the extensions directory
fd -t f "interfaces.ts" | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 146


🏁 Script executed:

#!/bin/bash
# Search for all SceneConfig interface definitions in the codebase
rg "interface SceneConfig" -A 5

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 775


🏁 Script executed:

#!/bin/bash
# Check the current state of load3dService.ts around lines 10-14
sed -n '1,30p' src/services/load3dService.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 970


Consider importing the existing SceneConfig interface instead of defining a local duplicate.

There's already a SceneConfig interface defined in src/extensions/core/load3d/interfaces.ts with more complete properties (showGrid, backgroundColor, backgroundImage, backgroundRenderMode). The local definition here is a subset that may drift out of sync.

♻️ Proposed refactor to use the existing interface
-// Type definitions for Load3D node
-interface SceneConfig {
-  backgroundImage?: string
-  [key: string]: unknown
-}
+import type { SceneConfig } from '@/extensions/core/load3d/interfaces'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Type definitions for Load3D node
interface SceneConfig {
backgroundImage?: string
[key: string]: unknown
}
import type { SceneConfig } from '@/extensions/core/load3d/interfaces'
🤖 Prompt for AI Agents
In `@src/services/load3dService.ts` around lines 10 - 14, You’ve duplicated the
SceneConfig interface locally; replace the local definition in load3dService.ts
with an import of the canonical SceneConfig interface from the project’s load3d
interfaces module so you use the full, single source of truth (including
showGrid, backgroundColor, backgroundImage, backgroundRenderMode); update the
import statements to import SceneConfig and remove the local interface
declaration to prevent drift.

…the `SceneConfig` interface, and make `electronAPI` non-optional in the `ElectronWindow` type.
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Feb 2, 2026
@coderabbitai coderabbitai bot requested a review from AustinMroz February 2, 2026 12:13
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@src/services/load3dService.ts`:
- Line 19: viewerInstances is typed as Map<NodeId, any>, which breaks the "no
any" rule; update the map to use a concrete viewer instance type (or Map<NodeId,
unknown> if the concrete type is not yet defined) and propagate that type from
the factory/hook that creates it (useLoad3dViewer) by exporting/annotating its
return type so the map and consumers are strongly typed; locate viewerInstances
and the useLoad3dViewer function and replace the any with the appropriate
interface/class (or unknown) and adjust call sites to cast/assert to the
concrete viewer type or update their signatures to accept the new type.

In `@src/utils/envUtil.ts`:
- Around line 3-6: ElectronWindow currently marks electronAPI as required and
the electronAPI() helper asserts it non-null; change the types so electronAPI is
optional and electronAPI() returns ElectronAPI | undefined, then update call
sites to handle undefined (preserving guarded calls using isElectron()).
Concretely, modify the ElectronWindow type to make electronAPI?: ElectronAPI,
change the electronAPI() function signature/return to ElectronAPI | undefined,
and ensure places like electronDownloadStore.ts rely on isElectron() before
using the returned value or otherwise null-check the result.

syncLoad3dConfig?: () => void
}

const viewerInstances = new Map<NodeId, any>()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Remaining any type should be addressed.

This PR aims to remove explicit any usages, but viewerInstances still uses Map<NodeId, any>. Consider typing the return value of useLoad3dViewer or using unknown as a safer alternative.

♻️ Proposed refactor
-const viewerInstances = new Map<NodeId, any>()
+const viewerInstances = new Map<NodeId, ReturnType<typeof useLoad3dViewer>>()

As per coding guidelines: "NEVER use any type - use proper TypeScript types".

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const viewerInstances = new Map<NodeId, any>()
const viewerInstances = new Map<NodeId, ReturnType<typeof useLoad3dViewer>>()
🤖 Prompt for AI Agents
In `@src/services/load3dService.ts` at line 19, viewerInstances is typed as
Map<NodeId, any>, which breaks the "no any" rule; update the map to use a
concrete viewer instance type (or Map<NodeId, unknown> if the concrete type is
not yet defined) and propagate that type from the factory/hook that creates it
(useLoad3dViewer) by exporting/annotating its return type so the map and
consumers are strongly typed; locate viewerInstances and the useLoad3dViewer
function and replace the any with the appropriate interface/class (or unknown)
and adjust call sites to cast/assert to the concrete viewer type or update their
signatures to accept the new type.

Myestery added a commit that referenced this pull request Feb 2, 2026
## Summary

This PR removes `any` types from UI component files and replaces them
with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across UI components
- Used `ComponentPublicInstance` with explicit method signatures for
component refs
- Used `Record<string, unknown>` for dynamic property access
- Added generics for form components with flexible value types
- Used `CSSProperties` for style objects

### Files Changed

UI Components:
- src/components/common/ComfyImage.vue - Used proper class prop type
- src/components/common/DeviceInfo.vue - Used `string | number` for
formatValue
- src/components/common/FormItem.vue - Used `unknown` for model value
- src/components/common/FormRadioGroup.vue - Added generic type
parameter
- src/components/common/TreeExplorer.vue - Used proper async function
signature
- src/components/custom/widget/WorkflowTemplateSelectorDialog.vue -
Fixed duplicate import
- src/components/graph/CanvasModeSelector.vue - Used
`ComponentPublicInstance` for ref
- src/components/node/NodePreview.vue - Changed `any` to `unknown`
- src/components/queue/job/JobDetailsPopover.vue - Removed unnecessary
casts
- src/components/queue/job/JobFiltersBar.vue - Removed `as any` casts
- src/platform/assets/components/MediaAssetContextMenu.vue - Added
`ContextMenuInstance` type
- src/renderer/extensions/minimap/MiniMapPanel.vue - Used
`CSSProperties`
- src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts -
Added `PrimeVueTooltipElement` interface
-
src/renderer/extensions/vueNodes/widgets/components/form/FormSelectButton.vue
- Used `Record<string, unknown>`
-
src/workbench/extensions/manager/components/manager/infoPanel/tabs/DescriptionTabPanel.vue
- Added `LicenseObject` interface

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- Linting passes without errors (`pnpm lint`)

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498
- Part 10: #8499

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8499-Road-to-No-Explicit-Any-Part-10-2f86d73d365081aab129f165c7d02434)
by [Unito](https://www.unito.io)
@Myestery Myestery merged commit 2f8bd7b into main Feb 2, 2026
27 checks passed
@Myestery Myestery deleted the fix/remove-any-types-core branch February 2, 2026 16:30
@Myestery Myestery mentioned this pull request Feb 3, 2026
5 tasks
AustinMroz pushed a commit that referenced this pull request Feb 6, 2026
## Summary

This PR removes `any` types from widgets, services, stores, and test
files, replacing them with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across widgets and services
- Added proper type imports (TgpuRoot, Point, StyleValue, etc.)
- Created typed interfaces (NumericWidgetOptions, TestWindow,
ImportFailureDetail, etc.)
- Fixed function return types to be non-nullable where appropriate
- Added type guards and null checks instead of non-null assertions
- Used `ComponentProps` from vue-component-type-helpers for component
testing

#### Widget System
- Added index signature to IWidgetOptions for Record compatibility
- Centralized disabled logic in WidgetInputNumberInput
- Moved template type assertions to computed properties
- Fixed ComboWidget getOptionLabel type assertions
- Improved remote widget type handling with runtime checks

#### Services & Stores
- Fixed getOrCreateViewer to return non-nullable values
- Updated addNodeOnGraph to use specific options type `{ pos?: Point }`
- Added proper type assertions for settings store retrieval
- Fixed executionIdToCurrentId return type (string | undefined)

#### Test Infrastructure
- Exported GraphOrSubgraph from litegraph barrel to avoid circular
dependencies
- Updated test fixtures with proper TypeScript types (TestInfo,
LGraphNode)
- Replaced loose Record types with ComponentProps in tests
- Added proper error handling in WebSocket fixture

#### Code Organization
- Created shared i18n-types module for locale data types
- Made ImportFailureDetail non-exported (internal use only)
- Added @public JSDoc tag to ElectronWindow type
- Fixed console.log usage in scripts to use allowed methods

### Files Changed

**Widgets & Components:**
-
src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDefault.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
- src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue
-
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts
- src/lib/litegraph/src/widgets/ComboWidget.ts
- src/lib/litegraph/src/types/widgets.ts
- src/components/common/LazyImage.vue
- src/components/load3d/Load3dViewerContent.vue

**Services & Stores:**
- src/services/litegraphService.ts
- src/services/load3dService.ts
- src/services/colorPaletteService.ts
- src/stores/maskEditorStore.ts
- src/stores/nodeDefStore.ts
- src/platform/settings/settingStore.ts
- src/platform/workflow/management/stores/workflowStore.ts

**Composables & Utils:**
- src/composables/node/useWatchWidget.ts
- src/composables/useCanvasDrop.ts
- src/utils/widgetPropFilter.ts
- src/utils/queueDisplay.ts
- src/utils/envUtil.ts

**Test Files:**
- browser_tests/fixtures/ComfyPage.ts
- browser_tests/fixtures/ws.ts
- browser_tests/tests/actionbar.spec.ts
-
src/workbench/extensions/manager/components/manager/skeleton/PackCardGridSkeleton.test.ts
- src/lib/litegraph/src/subgraph/subgraphUtils.test.ts
- src/components/rightSidePanel/shared.test.ts
- src/platform/cloud/subscription/composables/useSubscription.test.ts
-
src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts

**Scripts & Types:**
- scripts/i18n-types.ts (new shared module)
- scripts/diff-i18n.ts
- scripts/check-unused-i18n-keys.ts
- src/workbench/extensions/manager/types/conflictDetectionTypes.ts
- src/types/algoliaTypes.ts
- src/types/simplifiedWidget.ts

**Infrastructure:**
- src/lib/litegraph/src/litegraph.ts (added GraphOrSubgraph export)
- src/lib/litegraph/src/infrastructure/CustomEventTarget.ts
- src/platform/assets/services/assetService.ts

**Stories:**
- apps/desktop-ui/src/views/InstallView.stories.ts
- src/components/queue/job/JobDetailsPopover.stories.ts

**Extension Manager:**
- src/workbench/extensions/manager/composables/useConflictDetection.ts
- src/workbench/extensions/manager/composables/useManagerQueue.ts
- src/workbench/extensions/manager/services/comfyManagerService.ts
- src/workbench/extensions/manager/utils/conflictMessageUtil.ts

### Testing

- [x] All TypeScript type checking passes (`pnpm typecheck`)
- [x] ESLint passes without errors (`pnpm lint`)
- [x] Format checks pass (`pnpm format:check`)
- [x] Knip (unused exports) passes (`pnpm knip`)
- [x] Pre-commit and pre-push hooks pass

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498
- Part 10: #8499

---------

Co-authored-by: Comfy Org PR Bot <[email protected]>
Co-authored-by: christian-byrne <[email protected]>
Co-authored-by: github-actions <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants